package java_thinking.unit_15._15_13;



import java_thinking.unit_15._15_3.Coffee;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @Description :   动态类型安全
 *                  Collections.checkedList可以用于检查类型问题，受检查的容器在你试图插入类型不正确的对象时抛出
 *                  ClassCastException，这与有泛型之前的原生容器形成了对比，对于以前的容器来说，当你将对象从容器中
 *                  取出时，才会通知你问题，有了Collections.checked就可以在插入时发现问题所在了
 * @author: cww
 * @DateTime: 2019-04-07 17:42
 */

class Latte extends Coffee {}
class Mocha extends Coffee {}
class Cappuccino extends Coffee {}
class Breve extends Coffee {}
class Americano extends Coffee {}

public class CheckedList35 {
    @SuppressWarnings("unchecked")
    static void oldStyleMethod(List probablyMocha) {
        probablyMocha.add(new Breve());
    }

    public static void main(String[] args) {
        List<Mocha> mochas = new ArrayList<>();
        oldStyleMethod(mochas);
        List<Mocha> mochas1 = Collections.checkedList(new ArrayList<Mocha>(),Mocha.class);
        try {
            //将会报错
            oldStyleMethod(mochas1);
        } catch (Exception e) {
            System.out.println(e);
        }
        List<Coffee> coffees = Collections.checkedList(new ArrayList<>(),Coffee.class);
        //将导出类型的对象放到将要检查基类型的受检查容器中是没有问题的
        coffees.add(new Mocha());
        coffees.add(new Breve());
    }
}
